# -*- coding:utf-8 -*-
# @FileName : app\decorators.py
# @Time     : 2025/11/28
# @Author   : 天空之城
"""装饰器模块

此模块提供应用中使用的装饰器函数，包括登录验证和权限验证。
"""
from functools import wraps
from flask import jsonify, g
from flask_jwt_extended import jwt_required, get_jwt_identity
from app.models import User, Permission


def login_required(f):
    """登录验证装饰器
    
    验证用户是否已登录，如果未登录则返回401错误。
    
    Args:
        f: 被装饰的函数
        
    Returns:
        装饰后的函数
    """
    @wraps(f)
    @jwt_required()
    def decorated_function(*args, **kwargs):
        # 获取当前用户ID
        user_id = int(get_jwt_identity())
        
        # 查询用户信息
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': '用户不存在'}), 401
        
        # 将用户信息存储到g对象中，方便后续使用
        g.user = user
        
        return f(*args, **kwargs)
    
    return decorated_function


def permission_required(permission_name):
    """权限验证装饰器
    
    验证用户是否具有指定的权限，如果没有则返回403错误。
    
    Args:
        permission_name: 权限名称
        
    Returns:
        装饰后的函数
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            # 确保用户已登录
            if not hasattr(g, 'user') or g.user is None:
                return jsonify({'error': '请先登录'}), 401
            
            # 检查用户是否具有指定权限
            if not g.user.has_permission(permission_name):
                return jsonify({'error': '权限不足'}), 403
            
            return f(*args, **kwargs)
        return decorated_function
    return decorator